package com.ahj.permission;

import android.app.Activity;
import android.content.Intent;

import androidx.annotation.NonNull;


import com.yanzhenjie.permission.AndPermission;
import com.yanzhenjie.permission.PermissionListener;
import com.yanzhenjie.permission.Rationale;
import com.yanzhenjie.permission.RationaleListener;

import java.util.List;

import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.PluginRegistry;

public class FlutterPermissionPlugin implements MethodChannel.MethodCallHandler, PluginRegistry.ActivityResultListener,
        PermissionListener, RationaleListener {
    public static final String CHANNEL = "com.qingning.qn/checkPermission";
    static MethodChannel channe;
    private Activity activity;
    private MethodChannel.Result mResult;
    private String[] permission;

    public FlutterPermissionPlugin(Activity activity) {
        this.activity = activity;
    }

    public static void registerWith(FlutterEngine flutterEngine, Activity activity12) {
        channe = new MethodChannel(flutterEngine.getDartExecutor(), CHANNEL);
        FlutterPermissionPlugin plugin = new FlutterPermissionPlugin(activity12);
        channe.setMethodCallHandler(plugin);
    }

    @Override
    public void onMethodCall(MethodCall methodCall, MethodChannel.Result result) {
        mResult = result;
        if (methodCall.method.equals("checkPermission")) {
            //解析参数
            List<Integer> list = methodCall.argument("permission");
            permission = PermissionUtils.getPermissions(list);
            if (permission.length == 0) {
                result.success("1");
            } else {
                checkPermission(permission);
            }
        } else if (methodCall.method.equals("openSetting")) {
            openAppSettings();
        } else {
            result.notImplemented();
        }
    }

    private void openAppSettings() {
        PermissionUtils.jumpPermissionPage(activity);
//        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
//        Uri uri = Uri.fromParts("package", activity.getPackageName(), null);
//        intent.setData(uri);
//        activity.startActivityForResult(intent, 1111);
    }

    /**
     * 检查权限
     *
     * @param permission
     */
    public void checkPermission(String... permission) {
        this.permission = permission;
        AndPermission.with(activity)
                .permission(permission)
                .callback(this)
                .rationale(this)
                .start();
    }


    @Override
    public void onSucceed(int requestCode, @NonNull List<String> grantPermissions) {
        // 权限授予成功
        mResult.success("1");
    }

    @Override
    public void onFailed(int requestCode, @NonNull List<String> deniedPermissions) {
        /*当用户拒绝权限并勾选了不再提示时，此时再次申请权限时将会直接回调申请失败，
        因此AndPermission提供了一个供用户在系统Setting中给我们授权的能力。
        我们在授权失败的回调方法中添加如下代码，以下三种选择一种即可：*/
        // 是否有不再提示并拒绝的权限。
        if (AndPermission.hasAlwaysDeniedPermission(activity, deniedPermissions)) {
//            // 第一种：用AndPermission默认的提示语。
//            AndPermission.defaultSettingDialog(this, 1111).show();

            mResult.success("2");
//            // 第二种：用自定义的提示语。
//            AndPermission.defaultSettingDialog(activity, 1111)
//                    .setTitle("权限申请失败")
//                    .setMessage("您拒绝了我们必要的一些权限，请在设置中授权,否则功能无法正常使用！")
//                    .setNegativeButton("取消", new DialogInterface.OnClickListener() {
//                        @Override
//                        public void onClick(DialogInterface dialog, int which) {
//                            // 未获得权限
//                            mResult.success("拒绝权限并勾选了不再提示");
//                        }
//                    })
//                    .setPositiveButton("去设置")
//                    .show();
//
//            // 第三种：自定义dialog样式。
//            SettingService settingService = AndPermission.defineSettingDialog(this, 1111);
//            // 你的dialog点击了确定调用：
//            settingService.execute();
//            // 你的dialog点击了取消调用：
//            settingService.cancel();
        } else {
            mResult.success("0");
        }
    }

    @Override
    public void showRequestPermissionRationale(int requestCode, Rationale rationale) {
        /*Android运行时权限有一个特点，在拒绝过一次权限后，再此申请该权限，在申请框会多一个不再提示的复选框，
        当用户勾选了不再提示并拒绝了权限后，下次再申请该权限将直接回调申请失败。
        因此Rationale功能是在用户拒绝一次权限后，再次申请时检测到已经申请过一次该权限了，允许开发者弹窗说明申
        请权限的目的，获取用户的同意后再申请权限，避免用户勾选不再提示，导致不能再次申请权限。*/

        rationale.resume();

//        方式一：使用AndPermssion默认MD风格对话框
//        此对话框可以自定义，调用rationale.resume()就可以继续申请。
//        AndPermission.rationaleDialog(activity, rationale).show();

//        方式二：自定义对话框
//        AlertDialog.newBuilder(this)
//                .setTitle("友好提醒")
//                .setMessage("你已拒绝过定位权限，沒有定位定位权限无法为你推荐附近的妹子，你看着办！")
//                .setPositiveButton("好，给你", (dialog, which) -> {
//                    rationale.resume();
//                })
//                .setNegativeButton("我拒绝", (dialog, which) -> {
//                    rationale.cancel();
//                }).show();
    }

    @Override
    public boolean onActivityResult(int requestCode, int resultCode, Intent intent) {
        /*如果你是在Activity/Fragment中调用的上述代码，那么当用户在系统Setting中操作完成后，会回调Activity/Fragment中的这个方法：*/
        switch (requestCode) {
            case 1111: { // 这个1111就是上面defineSettingDialog()的第二个参数。
                // 你可以在这里检查你需要的权限是否被允许，并做相应的操作。
                checkPermission(permission);
                break;
            }
        }
        return false;
    }
}
